#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<unistd.h>
#include<string>
#include<sys/types.h>
#include<sys/wait.h>


//父子通信：子进程写，父进程读

int main()
{
    //1. 父创建管道，[0][1]
    int pipefd[2] = {0};
    int n = pipe(pipefd);
    (void)n;// 防止编译器有告警
    // 2. fork创建子进程
    pid_t id = fork();
    if(id < 0) {
        perror("fork");
        exit(1);
    }
    else if(id == 0) {
        // 子进程，子进程写->close()??
        // 3. 父子关闭不需要的fd
        close(pipefd[0]);

        std::string str = "hello father, 我是子进程";
        std::string self = std::to_string(getpid());//getpid返回值是pid_t 其实就是int
        int cnt = 1;
        std::string message = str + ", " + self + ", ";
        while(true) {
            message += std::to_string(cnt++);//不用加\0之类的，那是C语言的规则，和管道无关
            write(pipefd[1], message.c_str(), message.size());//写到管道里
            sleep(1);
        }
    }
    else {
        // 子进程给父进程发送的是字符串
        //父进程
        // 3. 父子关闭不需要的fd，父进程读
        close(pipefd[1]);

        while(true) {
            char inbuffer[1024] = {0};//read里@3是期望读到的大小，还要给\0留一个
            ssize_t n = read(pipefd[0], inbuffer, sizeof(inbuffer)-1);
            if(n > 0) {
                inbuffer[n] = 0;//在末尾设置\0
                std::cout << "client->father# " << inbuffer << std::endl;
            }
            //TODO
        }

        pid_t rid = waitpid(id, nullptr, 0);
        (void)rid;
    }
    

    // 4. 正常传输数据
    return 0;
}